#pragma once

#include "iostream"
#include "vector"
#include "algorithm"
#include "TypeDefin.h"

using namespace std;
/*HJJ QQ479287006
 *输入：head = [1,2,3,4,5], left = 2, right = 4
输出：[1,4,3,2,5]
示例 2：

输入：head = [5], left = 1, right = 1
输出：[5]

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/reverse-linked-list-ii
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */

//  这个想法就是扯淡 判断的太多
//ListNode* reverseNode(ListNode*& head) {
//    if(head==nullptr||head->next==nullptr)
//        return head;
//
//    // 1 2 3 4
//    ListNode* ret=reverseNode(head->next);
//
//    head->next->next=head;
//
//    head->next=nullptr;
//
//    return ret;
//}
//
//
//
//ListNode* reverseBetween(ListNode* head, int left, int right) {
//    int count =right-left;
//
//    ListNode* startFront=head;//开始的前一个
//    ListNode* start=head;
//    ListNode* end=head;
//    ListNode* endNext=nullptr;
//    ListNode* temp=head;
//    while(left&&left>2){
//        left--;
//        temp=temp->next;
//    }
//
//    startFront=temp;
//    if(startFront)
//        start=startFront->next;
//
//
//    while(temp&&count>1)
//    {
//        right--;
//        temp=temp->next;
//    }
//
//    end=temp;
//
//    if(end)
//        endNext=end->next;
//
//    end->next=nullptr;
//
//    ListNode* res=   reverseNode(start);
//
//    if(start!=head)
//    {
//        startFront->next=res;
//    }
//
//    while(res->next){
//        res=res->next;
//    }
//
//    res->next=endNext;
//
//
//    return head;
//
//}
//  1 2 3 4 5  - 1 3 4 5
//  1 3 2 4 5
//  1 4 3 2 5
ListNode *reverseBetween(ListNode *head, int left, int right) {
    ListNode *dummy = new ListNode(0);//为了插入方便
    dummy->next = head;
    ListNode *pre = dummy;
    for (int i = 1; i < left; i++) {
        pre = pre->next;
    }

    head = pre->next;
    for (int i = left; i < right; i++) {
        //  1 2 3 4 5
        ListNode *temp = head->next;

        head->next = temp->next;

        temp->next = pre->next;//这边为什么不能直接等于 head 因为head 并不是一直紧邻 那个pre的
        pre->next = temp;

    }


    return dummy->next;

}
